//package com.glaciervirtualdevice.quart;
//
//import com.glaciervirtualdevice.constant.DataConstant;
//import com.glaciervirtualdevice.dto.THDateDTO;
//import org.quartz.*;
//import org.quartz.impl.StdSchedulerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.CommandLineRunner;
//import org.springframework.stereotype.Component;
//
//import java.util.HashMap;
//import java.util.Map;
//import java.util.Random;
//
///**
// * @Author: Sun
// * @DateTime: 2025/4/1 15:13
// * @Description: 温湿度调度工具类，使用 Quartz 框架实现定时生成温湿度数据并存储。
// **/
//@Component
//public class WarmHumidQuartz implements CommandLineRunner {
//    // Quartz 调度器实例，用于管理定时任务
//    private static Scheduler scheduler;
//    // 用于存储每个组的最新温湿度信息，键为组名，值为 THDateDTO 对象
//    private static final Map<String, THDateDTO> groupResults = new HashMap<>();
//    // 默认的任务执行时间间隔，使用 Cron 表达式，从 DataConstant 类中获取初始值
//    private static String gopTime = DataConstant.GOP_TIME;
//    // 默认的温度值，从 DataConstant 类中获取初始值
//    private static int defaultTemperature = DataConstant.WARM_DATE;
//    // 默认的湿度值，从 DataConstant 类中获取初始值
//    private static int defaultHumidity = DataConstant.HUMI_DATE;
//    // 用于生成随机数的 Random 对象
//    private static final Random random = new Random();
//
//    // 私有构造函数，防止外部实例化该类，确保该类以工具类的形式使用
//    private WarmHumidQuartz() {
//    }
//
//    /**
//     * 修改默认的任务执行时间间隔、温度和湿度参数，并重新初始化所有已存在的任务以应用新参数。
//     *
//     * @param gopTime    新的任务执行 Cron 表达式
//     * @param temperature 新的默认温度
//     * @param humidity    新的默认湿度
//     */
//    public static void modifyDefaultParams(String gopTime, int temperature, int humidity) {
//        // 更新默认的时间间隔
//        WarmHumidQuartz.gopTime = gopTime;
//        // 更新默认的温度
//        defaultTemperature = temperature;
//        // 更新默认的湿度
//        defaultHumidity = humidity;
//        // 重新初始化所有已存在的任务以应用新的参数
//        try {
//            // 如果调度器不为空且未关闭，则关闭调度器
//            if (scheduler != null && !scheduler.isShutdown()) {
//                scheduler.shutdown();
//            }
//            // 遍历所有已存在的组名
//            for (String groupName : groupResults.keySet()) {
//                // 重新初始化每个组的调度任务
//                initScheduler(groupName);
//            }
//        } catch (SchedulerException e) {
//            // 打印调度器异常信息
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 初始化调度器，使用默认参数和传入的组名创建并启动一个定时任务。
//     *
//     * @param groupName 组名，用于标识任务和存储结果
//     */
//    public static void initScheduler(String groupName) {
//        try {
//            // 获取 Quartz 调度器的默认实例
//            scheduler = StdSchedulerFactory.getDefaultScheduler();
//
//            // 创建一个 JobDetail 对象，指定要执行的任务类为 WarmHumidJob
//            JobDetail job = JobBuilder.newJob(WarmHumidJob.class)
//                    .withIdentity("WarmHumidJob_" + groupName, groupName)
//                    .usingJobData("warmDate", defaultTemperature)
//                    .usingJobData("humidDate", defaultHumidity)
//                    .build();
//
//            // 创建一个 Trigger 对象，设置任务的执行计划为按照 gopTime 对应的 Cron 表达式执行，无限循环
//            Trigger trigger = TriggerBuilder.newTrigger()
//                    .withIdentity("WarmHumidTrigger_" + groupName, groupName)
//                    .withSchedule(CronScheduleBuilder.cronSchedule(gopTime))
//                    .build();
//
//            // 将任务和触发器注册到调度器中
//            scheduler.scheduleJob(job, trigger);
//            // 启动调度器
//            scheduler.start();
//        } catch (SchedulerException e) {
//            // 打印调度器异常信息
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 根据组名获取最新的温湿度信息。如果该组的任务未初始化，则先初始化任务。
//     *
//     * @param groupName 组名，用于标识要获取的温湿度信息
//     * @return 该组的最新温湿度信息，封装在 THDateDTO 对象中
//     */
//    public static THDateDTO getTemperatureHumidityByGroup(String groupName) {
//        // 检查该组是否已经存在于结果映射中
//        if (!groupResults.containsKey(groupName)) {
//            // 如果不存在，则初始化该组的调度任务
//            initScheduler(groupName);
//        }
//        // 从结果映射中获取该组的最新温湿度信息
//        return groupResults.get(groupName);
//    }
//
//    /**
//     * 存储每个组的最新温湿度信息。
//     *
//     * @param groupName 组名，用于标识要存储的温湿度信息
//     * @param result    该组的最新温湿度信息，封装在 THDateDTO 对象中
//     */
//    public static void storeGroupResult(String groupName, THDateDTO result) {
//        // 将该组的温湿度信息存储到结果映射中
//        groupResults.put(groupName, result);
//    }
//
//    // 结束任务
//    public static void stopDevice(String groupName) {
//        TriggerKey triggerKey = TriggerKey.triggerKey(groupName);
//        try {
//            scheduler.pauseTrigger(triggerKey);
//            scheduler.unscheduleJob(triggerKey);
//            scheduler.deleteJob(JobKey.jobKey(groupName));
//
//        } catch (SchedulerException e) {
//            throw new RuntimeException(e);
//        }
//
//    }
//
//    @Override
//    public void run(String... args) throws Exception {
//        // 在项目启动时初始化默认组的任务
//        initScheduler("defaultGroup");
//    }
////}